import groovy.json.JsonOutput
import groovy.json.JsonSlurperClassic

import java.security.MessageDigest

/*
* 常用工具集合
* */

def call(Closure cb) {
    cb.delegate = this
    return cb()
}

/**
 * 检查某个类是否存在，此工具将会打印类信息
 * <p>
 *     用法：<br>
 *         def result = Utils { checkClass "类名" }* </p>
 * @param className 类名
 * @return 如果存在返回true，否则返回false
 */
String classExists(className) {
    if (!className) {
        return
    }
    try {
        Class clazz = Class.forName(className)
        def url = this.getClass().getClassLoader().getResource(className.replaceAll("\\.", '/') + ".class")
        println("class=${clazz},url=${url}")
        return true
    } catch (Exception e) {
        println "未找到class:" + className
        printError(e)
        return false
    }
}

/**
 * 判断linux命令是否存在
 * <p>
 *     用法：<br>
 *         def result = Utils { commandExists "命令名" }* </p>
 * @param command 命令
 * @return 存在返回true
 */
boolean commandExists(command) {
    def result = sh returnStatus: true, script: "command -v ${command}"
    return result == 0
}

/**
 * 删除目录
 * @param path
 * @return
 */
def rmDir(String path) {
    dir(path) {
        deleteDir()
    }
}

/**
 * 计算md5
 * <p>
 *     用法：<br>
 *         def result = Utils { md5 "目标数据" }* </p>
 * @param str
 * @return
 */
String md5(str) {
    def hexArr = "0123456789abcdef"
    MessageDigest messageDigest = MessageDigest.getInstance("MD5")
    messageDigest.update(str.getBytes("utf-8"))
    messageDigest.digest().inject("") {
        a, b -> a + hexArr[b >>> 4 & 0x0F] + hexArr[b & 0x0F]
    }
}

/**
 * jenkins没有打印异常的工具，因此定义一个可方便查看错误
 * @param e
 */
def printError(Throwable e) {
    ByteArrayOutputStream out = new ByteArrayOutputStream()
    PrintStream ps = new PrintStream(out)
    e.printStackTrace(ps)
    println("${e.getClass()}")
    println(out.toString("utf-8"))
}

/**
 * 转换成json字符串
 * @param obj
 * @return
 */
def toJson(obj) {
    return new JsonOutput().toJson(obj)
}

/**
 * 将json字符串转换成对象
 * @param json
 * @return
 */
def parseJson(json) {
    return new JsonSlurperClassic().parseText(json) // 重点
}

/**
 * 读取json文件
 * @param filePath
 * @return
 */
def readJsonFile(String filePath, encoding = "utf-8") {
    def result = readFile(encoding: encoding, file: filePath)
    return parseJson(result)
}

/**
 * 写json文件
 * @param filePath
 * @param obj
 * @param encoding
 * @return
 */
def writeJsonFile(String filePath, Object obj, encoding = "utf-8") {
    writeFile encoding: encoding, file: filePath, text: toJson(obj)
}

/**
 *
 * @param len
 * @return
 */
def uuid(len = 32) {
    StringBuilder sb = new StringBuilder()
    while (sb.length() < len) {
        UUID uuid = UUID.randomUUID()
        sb.append(uuid.toString().replaceAll("-", ""))
    }
    return sb.substring(0, len);
}

/**
 * 获取机器的架构类型
 */
def machine() {
    return sh(script: "uname -m", returnStdout: true).trim()
}

/**
 * 尝试执行回调函数，直接回调函数返回true或不报错为止
 * @param closure 回调函数
 * @param time 时间（默认为10）
 * @param unit 时间单位，默认为MINUTES,[NANOSECONDS|MICROSECONDS|MILLISECONDS|SECONDS|MINUTES|HOURS|DAYS]
 */
def tryUntil(Closure closure, time = 10, unit = 'MINUTES') {
    timeout(time: time, unit: unit) {
        waitUntil(initialRecurrencePeriod: 10000) {
            try {
                closure.call()
                true
            } catch (e) {
                false
            }
        }
    }
}